home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / isnan.c,v < prev    next >
Text File  |  1991-12-03  |  3KB  |  179 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.2.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     91.08.29.21.52.22;  author rab;  state Exp;
  11. branches 1.2.1.1;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     90.11.02.07.49.34;  author rab;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19. 1.2.1.1
  20. date     91.12.02.21.47.00;  author kupfer;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24.  
  25. desc
  26. @@
  27.  
  28.  
  29. 1.2
  30. log
  31. @Fix to work with little endian.
  32. @
  33. text
  34. @/* 
  35.  * isnan.c --
  36.  *
  37.  *    Machine-dependent procedure to determine whether a double is a
  38.  *    "NaN" floating-point number.
  39.  *
  40.  * Copyright 1989 Regents of the University of California
  41.  * Permission to use, copy, modify, and distribute this
  42.  * software and its documentation for any purpose and without
  43.  * fee is hereby granted, provided that the above copyright
  44.  * notice appear in all copies.  The University of California
  45.  * makes no representations about the suitability of this
  46.  * software for any purpose.  It is provided "as is" without
  47.  * express or implied warranty.
  48.  */
  49.  
  50. #ifndef lint
  51. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/isnan.c,v 1.1 90/11/02 07:49:34 rab Exp Locker: rab $ SPRITE (Berkeley)";
  52. #endif /* not lint */
  53.  
  54. #include <math.h>
  55. #include <machparam.h>
  56.  
  57. #if BYTE_ORDER==BIG_ENDIAN     
  58. #define MSW 0
  59. #define LSW 1
  60. #endif
  61. #if BYTE_ORDER==LITTLE_ENDIAN
  62. #define MSW 1
  63. #define LSW 0
  64. #endif
  65.  
  66.  
  67. /*
  68.  *----------------------------------------------------------------------
  69.  *
  70.  * isnan --
  71.  *
  72.  *    Return whether a double is equivalent to NaN.
  73.  *
  74.  * Results:
  75.  *    1 if the number is NaN, 0 otherwise.
  76.  *
  77.  * Side effects:
  78.  *    None.
  79.  *
  80.  *----------------------------------------------------------------------
  81.  */
  82.  
  83. int
  84. isnan(value)
  85.     double value;
  86. {
  87.     union {
  88.     double d;
  89.     long l[2];
  90.     } u;
  91.  
  92.     /*
  93.      * Put the value into a union so we can check out the bits.
  94.      */
  95.     u.d = value;
  96.  
  97.  
  98.     /*
  99.      * An IEEE Std 754 double precision floating point number
  100.      * has the following format:
  101.      *
  102.      *      1  bit       -- sign of Mantissa
  103.      *      11 bits      -- exponent
  104.      *      52 bits      -- Mantissa
  105.      *
  106.      * If the exponent has all bits set, the value is not a 
  107.      * real number.
  108.      *
  109.      * If the Mantissa is zero then the value is infinity, which
  110.      * is the result of division by zero, or overflow.
  111.      *
  112.      * If the Mantissa is non-zero the value is not a number (NaN).
  113.      * NaN can be generated by dividing zero by itself, taking the
  114.      * logarithm of a negative number, etc.
  115.      */
  116.  
  117.     /*
  118.      * check the exponent
  119.      */
  120.     if ((u.l[MSW] & 0x7ff00000) == 0x7ff00000) {
  121.  
  122.     /*
  123.      * See if the Mantissa is zero.
  124.      */
  125.     if ((u.l[MSW] & ~0xfff00000) == 0 && u.l[LSW] == 0) {
  126.         /*
  127.          * Infinity.
  128.          */
  129.         return (0);
  130.     } else {
  131.         /*
  132.          * NaN.
  133.          */
  134.         return (1);
  135.     }
  136.     } else {
  137.     /*
  138.      * Normal.
  139.      */
  140.     return (0);
  141.     }
  142. }
  143.  
  144.  
  145. @
  146.  
  147.  
  148. 1.2.1.1
  149. log
  150. @Initial branch for Sprite server.
  151. @
  152. text
  153. @d18 1
  154. a18 1
  155. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/isnan.c,v 1.2 91/08/29 21:52:22 rab Exp $ SPRITE (Berkeley)";
  156. @
  157.  
  158.  
  159. 1.1
  160. log
  161. @Initial revision
  162. @
  163. text
  164. @d18 1
  165. a18 1
  166. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/sun3.md/RCS/isnan.c,v 1.2 90/09/11 14:47:34 kupfer Exp $ SPRITE (Berkeley)";
  167. d22 1
  168. d24 9
  169. d87 1
  170. a87 1
  171.     if ((u.l[0] & 0x7ff00000) == 0x7ff00000) {
  172. d92 1
  173. a92 1
  174.     if ((u.l[0] & ~0xfff00000) == 0 && u.l[1] == 0) {
  175. d101 1
  176. a101 1
  177.         return(1);
  178. @
  179.